package com.alibaba.sdk.enums;

import com.baomidou.mybatisplus.annotation.EnumValue;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;

import java.util.Optional;
import java.util.stream.Stream;

/**
 * 用户类型
 *
 * @ writer Shawn(Shawn_0217@163.com)
 * @ date & time 2021/4/26 23:05
 * @ company alibaba
 */
@Slf4j
@Getter
@AllArgsConstructor
public enum UserTypeEnum implements BaseEnum{

    /**
     * 超级管理员
     */
    SUPER_ADMIN(1, "超级管理员"),

    /**
     * 管理员
     */
    ADMIN(2, "管理员"),

    /**
     * 普通用户
     */
    USER(3, "普通用户");

    /**
     * 自定义Mybatis-plus枚举字段, @EnumValue
     */
    @EnumValue
    @ApiModelProperty(value = "类型id", required = true)
    private Integer code;

    /**
     * 用户类型名称
     * 自定义JSON序列化字段, @JsonValue
     */
    @JsonValue
    @ApiModelProperty(value = "类型名称", required = true)
    private String name;

    /**
     * 自定义JSON反序列化(初始化函数,指定但序列化时的构造函数)
     *
     * @param code 用户类型code
     * @return UserTypeEnum code所对应的用户类型
     * @throws Exception
     */
    @JsonCreator(mode = JsonCreator.Mode.DELEGATING)
    public static UserTypeEnum getByCode(Integer code) {
        Optional<UserTypeEnum> enumOptional = Stream.of(UserTypeEnum.values()).filter(userTypeEnum -> userTypeEnum.getCode().equals(code)).findFirst();
        return enumOptional.orElse(null);
    }

}
